<html>
  <head>
    <title>
      TODO应用程序
    </title>
  </head>
  <body>
    <script>
      /*
          ToDo 应用程序教程

          欢迎来到ABP。  这是一个但部分快速入门教程，用于构建简单应用程序。如果你想快速了解ABP的工作原理，可以从这个教程开始。

          ★、选择解决方案架构
                本教程有多个版本，请选择最合适你的而一个：

                ①、单层解决方案：  创建一个单项目解决方案。推荐用于构建简单且易于理解的应用程序。
                ②、分层解决方案：  基于领域驱动设计实践的完全分层(多个项目)解决方案。推荐用于需要可维护和可扩展代码库的长期项目。
      */

      /*
          ToDo 应用程序，单层解决方案版本
                这是一个单层快速入门教程，用于使用ABP构建简单的待办事项(ToDo)应用程序。以下是最终应用程序的截图：

            
                1、前期准备
                      ①、一个支持.net 8.0的IDE
                      ②、Node v18.19+
                    
                2、创建新解决方案：
                      在本教程中，我们将使用ABP CLI通过ABP创建示例应用程序。如果你尚未安装ABP CLI，可以在命令行终端运行以下命令来安装：

                        "dotnet tool install -g Volo.Abp.Studio.Cli"

                      然后创建一个空文件夹，打开命令行终端，并在终端中执行以下命令：

                        "abp new ToDoApp -t app-nolayers"
                      
                      这将创建一个名为ToDoApp的新解决方案，其中包含一个项目。一旦解决方案准备就绪，请使用你喜欢的ＩＤＥ打开它。


                3、在开始运行项目之前：
                      
                      如果你已经使用ABP CLI创建了解决方案，可以直接跳到"运行应用程序"部分。ABP CLI会自动执行以下步骤。
                      然而有时这些步骤可能需要手动完成。
                      例如，如果你是从源控制系统克隆了应用徐成代码，则需要手动执行这些步骤：

                          ①、先生成一下解决方案，看能否正常生成，是否出现有依赖的包没有引用到。

                          ①、你可以在项目的根目录(.csproj 文件所在的文件夹)中运行以下命令来创建数据库并填充初始数据：
                                  "dotnet run --migrate-database"
                                此命令将创建数据库并为你填充初始数据。你也可以执行解决方案中包含的 migrate-database.ps1脚本来完成相同的操作。
                                (在具体项目下执行数据库迁移命令)

                          ②、安装客户端包  
                                在解决方案根目录中运行 abp  install-libs 命令以安装所有必须的NPM包：
                                  "abp install-libs"
                                (在解决方案根目录下运行安装客户端包的命令)

                4、运行应用程序
                      在开始开发之前，最好先运行以下应用程序。
                      运行应用程序非常简单，你可以使用任何支持.net 8.0的IDE运行应用程序，或者在项目目录中通过 dotnet run命令运行。
                      (cmd进入项目根目录下，直接执行 "dotnet run")
                      
                      你可以点击"Login" 按钮，并使用 "admin"作为用户名，  "1q2w3E*"做为密码登录


                5、定义实体(Defining The Entity)
                      这个应用程序将包含一个单一的实体，我们可以从创建它开始。因此，在项目的Entities文件夹下创建一个新的ToDoItem类
                     
                      BasicAggregateRoot 是创建根实体的最简单的基类，这里实体的主键（Id）是 Guid。

                6、数据库集成
                      下一步是设置 Entity Framework Core的配置。
                        
                        ①、映射配置
                               在"Data"文件夹下，打开 ToDoDbContext(应用程序数据库上下文类) 类，往类中添加一个名为 ToDoItems的DbSet<ToDoItem>类型属性
                                
                               然后同样是这个类下的 OnModelCreating 方法中添加数据库映射配置.(指定实体映射到的数据表名)

                               现在，已经将ToDoItem实体映射到了数据库中的ToDoItems表中。接下俩的步骤是创建数据库迁移，并将这些迁移应用到数据库。
                            
                        ②、Code First Migrations (数据库迁移)
                               ★、添加迁移
                                    由于我们已经修改了数据库映射配置，我们应该创建一个新的迁移并将更改应用到数据库。
                                    在项目根目录(与 .csproj 文件相同的文件夹)中打开命令行终端，并输入以下命令：
                                        "dotnet ef migrations add Added_ToDoItem"
                                    这将向项目中添加一个新的迁移类，此时程序会往项目中添加一个名为Migrations的文件夹，并且你在文件夹中会看到新的迁移类。

                               ★、应用迁移
                                    然后，你可以使用以下命令在同一命令行终端中应用更改到数据库：
                                        "dotnet ef database update"
                              

                在完成数据库集成之后，现在我们可以开始创建应用服务方法并实现我们的用例了。

                  7、创建应用程序服务
                        应用服务用于执行应用程序的用例。我们需要在该应用中执行以下用例：
                              ①、获取待办事项列表
                              ②、创建一个新的待办事项
                              ③、删除一个现有的待办事项

                        在开始实现这些用例之前，首先我们需要创建一个将在应用服务中使用的DTO类。

                        ①、创建数据传输类(Data Transfer Object)(DTO)
                                应用程序服务通常获取和返回DTO(数据传输对象)，而不是实体。 因此，在Service/Dtos 文件下创建一个新的ToDoItemDto类。

                                这是一个很简单的DTO，它与ToDoItem实体拥有相同的属性。
                                现在我们可以实现我们的用例了。
                        
                        ②、创建服务
                                首先，在Abstractions 文件夹下创建名为IToDoService的接口，用于服务注入。
                                然后，在Services文件夹在创建名为 ToDoService的类，实现IToDoService接口，并且实现ITransientDependency接口(将服务注册到容器)
                                
                                获取ToDo待办事项列表

                           
                            
      */
    </script>
  </body>
</html>